#include "timer.h"

u16 ms5=0,ms10 = 0,ms20 = 0,ms50 = 0,ms100 = 0,ms1000 = 0; //时间总线系数
u16 SPL06_Scan =0;

float pressure, temperature,asl;



/*****************************************************************************
*函  数：void TIM2_Init(void)
*功  能：TIM2初始化为10ms计数一次
*参  数：无
*返回值：无
*备  注：更新中断时间 Tout = (ARR-1)*(PSC-1)/CK_INT
*****************************************************************************/
void TIM2_Init(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	
  //TIM2~TIM5时钟来源于APB1*2
  TIM_TimeBaseStructure.TIM_Period = 10000-1; //自动重装载值
  TIM_TimeBaseStructure.TIM_Prescaler = 84-1; //预分频值
  TIM_TimeBaseStructure.TIM_ClockDivision = 0; 
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
	       
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
	
  TIM_Cmd(TIM2,ENABLE);
}

/*****************************************************************************
*函  数：void TIM4_Init(void)
*功  能：TIM4初始化为5ms计数一次
*参  数：无
*返回值：无
*备  注：更新中断时间 Tout = (ARR-1)*(PSC-1)/CK_INT
*****************************************************************************/
void TIM4_Init(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
	
  //TIM2~TIM5时钟来源于APB1*2
  TIM_TimeBaseStructure.TIM_Period = 5000-1; //自动重装载值
  TIM_TimeBaseStructure.TIM_Prescaler = 84-1; //预分频值
  TIM_TimeBaseStructure.TIM_ClockDivision = 0; 
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
	       
	TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);
	
  TIM_Cmd(TIM4,ENABLE);
}

/****************************************************************************************************
*函  数: void TIM2_IRQHandler(void) 
*功  能: TIM2定时器中断，10ms进一次中断也就是100Hz
*参  数: 无
*返回值: 无
*备  注: 此函数是整个程序的运行时基，不同的中断时间对应不同频率，
*        对于一些计算对调用时间要求比较严格时可用此方法；
*        扫描频率 = 100Hz/分频系数；
****************************************************************************************************/
void TIM2_IRQHandler(void) 
{
	if(TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET)
	{
		////////////计时时间控制/////////////
		ms10++;
		//ms100++;
		//if(ms100 >= 20)
		//{
		//	ms100 = 0;
		//SPL06_Scan++;
		//}
		
	}
	TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}
		//float in_time,out_time,delay_1,time_flag=1;//测时间
/****************************************************************************************************
*函  数: void TIM4_IRQHandler(void) 
*功  能: TIM4定时器中断，5ms进一次中断也就是200Hz
*参  数: 无
*返回值: 无
*备  注: 此函数是整个程序的运行时基，不同的中断时间对应不同频率，
*        对于一些计算对调用时间要求比较严格时可用此方法；
*        扫描频率 = 100Hz/分频系数；
****************************************************************************************************/
void TIM4_IRQHandler(void) 
{
	if(TIM_GetITStatus(TIM4,TIM_IT_Update) != RESET)
	{
		////////////传感器采样与控制/////////////
		//if(time_flag) in_time = 10000*ms10+TIM2->CNT;//计算运行时间-起始时间
		if( imu_off==1 ) IMU(); //姿态解算
		static int i;
		i++;
		if(i==2) {AK8975_Updata();i=0;}//两次进一次
		HC_SR04_Read();//超声波距离解算
		SPL06_Read();//气压计高度解算
		Altitude_Read();//高度、速度解算
		//Kalman_Filter(HC_V,ag,&V_Z1);//二阶卡尔曼滤波融合超声波和加速度计获取Z轴方向速度  注意：当卡尔曼增益K=互补滤波的A时，两种效果相同
		//Altitude_Kalman();
		//Kalman_Filter(HC_SR04_Distance-15,altitude);//卡尔曼融合气压计和超声波数据
		Control();
		//if(time_flag) {out_time=10000*ms10+TIM2->CNT;time_flag=0;}//计算运行时间-结束时间
		//delay_1=out_time-in_time;
	}
	TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
}
